//
//  TJHomeTableViewController.swift
//  TJSinaWeibo
//
//  Created by 唐后能 on 16/4/8.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit
import SVProgressHUD
import SVPullToRefresh

let Identifier:String = "Identifier"
class TJHomeTableViewController: TJBaseTableViewController {

    // 模型数组.
    var statusModels:[TJStatus]? {
    
        didSet { // 只要一获得新的微博数据,就刷新表格.
            self.tableView.reloadData()
            // TJPrint("status模型=\(self.statusModels)")
        }
    }
    
    // MARK - 懒加载下拉刷新控件.
    private lazy var pullDownRefreshView:TJPullDownRefreshControl = TJPullDownRefreshControl()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // 0,如果用户没有登录,不做下一步操作.
        if !TJAccountViewModel.shareUserAccount.isUserAccountLogin {
        
            return
        }
        // 1,设置导航栏按钮.
        setNavBtn()
        
        // 2,设置talbeView相关.
        setupTableView()
    }
    
    
    // MARK - 设置tableView.
    private func setupTableView() {
    
        // 注册cell.
        self.tableView.registerClass(TJStatusViewCell.self, forCellReuseIdentifier: Identifier)
        // 设置tableView行高自适应.
        tableView.rowHeight = UITableViewAutomaticDimension
        // 设置预估行高.
//        tableView.estimatedRowHeight = 100   // 设置了预估行高,在滚动tableView的时候,会实时计算行高,消耗性能.
        
        // 取消分割线.
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None

        // MARK -下拉刷新相关.
        // 在tableview顶部添加下拉刷新控件.
        tableView.addSubview(pullDownRefreshView)
        
        // 一开始进来,立即加载默认的20条微博数据.
        
        // 处理tableView的下拉刷新.
        pullDownRefreshView.refreshHander = { ()->() in
            
           self.loadNewStatuses()
        }
        
        // loadNewStatuses() //这样直接调,不能显示"正在刷新"
        pullDownRefreshView.startRefresh() // 要放在闭包定义的后面.
        
        
        // MARK -上拉刷新相关.-->等加载最开始的20条微博后才开启下拉刷新功能.
//        tableView.addInfiniteScrollingWithActionHandler { () -> Void in
//            self.loadMoreStatus()
//        }
        
    }
    
    // MARK - 下拉加载新数据.
    private func loadNewStatuses(){
    
        // 3,调用statusViewModle发请求,拿微博数据.
            // 先拿到第一条微博的id.
        let since_id = statusModels?.first?.id ?? 0
        TJStatusViewModel.shareStatusManager.loadStatus (since_id, max_id:0) { (statuses, error) -> () in
            // 完成加载新数据后,让刷新控件完成刷新.
            self.pullDownRefreshView.endRefresh()
            // 处理请求失败情况.
            if error != nil {
                // 请求失败.
                TJPrint("请求微博数据失败:\(error)")
                SVProgressHUD.showErrorWithStatus("您的网络不给力!")
                return
            }
            // 请求成功,将数据赋值给模型数组,进行传递,显示UI.
            // 判断返回微博的数量.
            let count = statuses?.count ?? 0
            TJPrint("获取\(count)条微博数据")
            
            // 提示加载微博的数量.
            if since_id > 0 {
            
                self.showTipLabel(count)
            }
            
            // 是否有微博数据.
            if count == 0 {
    
                SVProgressHUD.showInfoWithStatus("没有新的微博数据")
                return
            }
            
            // 是否有新的微博数据.
            if since_id == 0 { //没有新的微博数据,只有刚进入程序开始的20条微博.
            
                self.statusModels = statuses
                // 此处已经加载并显示了最开始的20条微博,可以开启上拉加载更多功能了.
                self.tableView.addInfiniteScrollingWithActionHandler { () -> Void in
                    self.loadMoreStatus()
                }
                
                
            }else if since_id > 0 {
            
                self.statusModels = statuses! + self.statusModels!
            }
        }
    }
    // MARK - 上拉加载更多数据.
    private func loadMoreStatus () {
    
        // 现获取模型数组的最后一条微博的id.
        let max_id = self.statusModels?.last?.id ?? 0
        // 如果max_id为0,则表示数据库中一条微博都没有,没必要加载了.
        if max_id == 0 {
        
            SVProgressHUD.showInfoWithStatus("没有微博数据")
            return
        }
        
        // 通知statusViewModel去请求比max_id还早的微博.
        TJStatusViewModel.shareStatusManager.loadStatus(0, max_id: max_id) { (statuses, error) -> () in
            // 请求成功后,让下拉控件结束
            self.tableView.infiniteScrollingView.stopAnimating()
            
            // 处理请求失败情况.
            if error != nil {
                // 请求失败.
                TJPrint("请求更多的微博数据失败:\(error)")
                SVProgressHUD.showErrorWithStatus("您的网络不给力!")
                return
            }
            // 请求成功,将数据赋值给模型数组,进行传递,显示UI.
            // 判断返回微博的数量.
            let count = statuses?.count ?? 0
            TJPrint("获取\(count)条更多的微博数据")
            // 是否有微博数据.
            if count == 0 {
                
                SVProgressHUD.showInfoWithStatus("没有更多的微博数据了")
                return
            }
            
            self.statusModels = self.statusModels! + statuses!
        }
        
    }
    
    // 显示加载数据的提示框.
    private func showTipLabel(count:Int) {
    
        tipLabel.text = count==0 ? "亲,已经没有更新的微博啦!" : "加载了\(count)条新的微博"
        // 防止动画叠加.
        if let keys = tipLabel.layer.animationKeys(){
            TJPrint("正在执行动画\(keys)")
            // 说明UIView动画正在执行.
            return
        }
        
        // 用动画将label移动到导航栏之下.
        UIView.animateWithDuration(1, delay: 0, options: [], animations: { () -> Void in
            self.tipLabel.frame = CGRect(x: 0, y: tipLabelHeight, width: UIScreen.mainScreen().bounds.width, height: tipLabelHeight)
            }) { (_) -> Void in
                // 再开启一个UIView动画,停顿0.5S后退回去.
                UIView.animateWithDuration(1, delay: 0.5, options: [], animations: { () -> Void in
                    self.tipLabel.frame = CGRect(x: 0, y: -(tipLabelHeight+20), width: UIScreen.mainScreen().bounds.width, height: tipLabelHeight)
                    }, completion: nil) //完成之后不要移除label,因为是懒加载的,只有一个,在屏幕外面.
        }
        
    }
    
    // MARK - 设置导航栏按钮.
    private func setNavBtn() {
    
        // 设置导航栏的左边按钮.
        navigationItem.leftBarButtonItem =  UIBarButtonItem(imgName: "navigationbar_friendsearch", hightImgName: "navigationbar_friendsearch_highlighted",target: self,action: Selector("addFriendBtnClicked"))
        
        
        // 设置导航栏右边的按钮.
        navigationItem.rightBarButtonItem = UIBarButtonItem(imgName: "navigationbar_pop", hightImgName: "navigationbar_pop_highlighted",target: self,action: Selector("saoyisaoBtnClicked"))
        
        // 创建中间按钮.-->自定义按钮.
        if let titleName = TJAccountViewModel.shareUserAccount.userAccount?.screen_name {
        let btn = TJHomeTitleBtn(title: titleName, imgName: "navigationbar_arrow_up", highlightImgName: nil)
        
        navigationItem.titleView = btn
        btn.addTarget(self, action: Selector("titleBtnClicked:"), forControlEvents: UIControlEvents.TouchUpInside)
        }
    }
    
    // MARK - 标题按钮的点击事件.
    @objc private func titleBtnClicked(btn:UIButton) {
    
        btn.selected = !btn.selected
        if btn.selected {
        
            UIView.animateWithDuration(0.25, animations: { () -> Void in
            btn.imageView?.transform = CGAffineTransformMakeRotation(CGFloat(M_PI)-0.0001)
                
                })
        }else{
            UIView.animateWithDuration(0.25) { () -> Void in
                
                btn.imageView?.transform = CGAffineTransformIdentity
            }
        }
    }
    @objc private func addFriendBtnClicked (){
    
        TJPrint("添加好友按钮点击了")
    }
    @objc private func saoyisaoBtnClicked (){
        
        TJPrint("扫一扫按钮点击了")
    }
    
    // MARK - 懒加载提示label.
    private lazy var tipLabel:UILabel = {
    

        let label = UILabel(fontSize: 14, contentColor: UIColor.whiteColor())
        // 设置.
        label.backgroundColor = UIColor.orangeColor()
        label.textAlignment =  NSTextAlignment.Center
        label.frame = CGRect(x: 0, y: -(tipLabelHeight+20), width: UIScreen.mainScreen().bounds.width, height: tipLabelHeight)
        // 将label添加到navgationBar的最下面.
        self.navigationController?.navigationBar.insertSubview(label, atIndex: 0)
        return label
    }()
}

// MARK talbeView数据源方法.
extension TJHomeTableViewController {

//MARK:     计算行高.
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        
        // 获取模型.
        let status = statusModels![indexPath.row]
        
        // 先判断模型中是否有缓存行高
        if status.rowHeight != nil {
        
            return status.rowHeight!
        }
        //dequeueReusableCellWithIdentifier: forIndexPath:会调用heightForRow造成循环调用.
        let cell = tableView.dequeueReusableCellWithIdentifier(Identifier) as! TJStatusViewCell
        
        // 把模型给cell,cell会设置自己的内容,根据cell的自动布局,获取cell的高度.
        cell.status = status
        let height = cell.systemLayoutSizeFittingSize(UILayoutFittingExpandedSize).height

        // 将获取的行高缓存到模型中.(在内存里)
        status.rowHeight = height
//        TJPrint("行号:\(indexPath.row), 行高:\(height)")
        return height
    }
    
    // 行数.
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//        TJPrint("模型数量:\((statusModels?.count))")
        return statusModels?.count ?? 0
    }
    
    // 行内容.
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//        let cell = tableView.dequeueReusableCellWithIdentifier(Identifier,forIndexPath:indexPath) as! TJStatusViewCell
        let cell = tableView.dequeueReusableCellWithIdentifier(Identifier) as! TJStatusViewCell
        cell.status = statusModels![indexPath.row]
        return cell
    }
    
    // 取消cell的高亮选中.--> 可以选中,松开手指后立即取消.
//    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//         tableView.deselectRowAtIndexPath(indexPath, animated: false)
//    }
    
    // 不被选中.-->但里面被转发的微博还是可以被选中.
    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        return false
    }
}



